package parts5.lesson64;

/**
 * 课时64 【第08个代码模型】ThreadLocal类
 */

/**
 * 本示例采用的就是不采用引用传递
 * 但是发现了一个问题，用户A和用户B设置的note只能生效一个
 * 造成此问题的原因：没有同步
 * 如果我们需要标记处每一个线程的具体对象信息，则需要使用ThreadLocal类
 * public class ThreadLocal<T>
 * extends Object
 * 这个类提供线程局部变量。这些变量不同于正常同行，
 * 每一个线程访问一个（通过其 get或 set法）有自己独立的变量，初始化复制。
 * ThreadLocal实例通常是私有的静态字段在类希望关联状态的线程（例如，一个用户ID或交易ID）。
 */
public class ThreadLocalMessageDemo {
    public static void main(String[] args) throws Exception {
        new Thread(()->{
            Message msg=new Message();
            msg.setNote("我来添加点东东");
            //MyUtil.message=msg;
            ThreadLocalUtil.set(msg);
            new ThreadLocalMessageConsumer().print();
        },"用户A").start();
        new Thread(()->{
            Message msg=new Message();
            msg.setNote("我不要东东");
            ThreadLocalUtil.set(msg);
            new ThreadLocalMessageConsumer().print();
        },"用户B").start();
    }
}
